package src.dp.rob;

public class no198 {//打家劫舍

    /**
     * 1. dp数组下标含义：考虑下标i（包括i）以内的房屋，最多可以偷窃的金额为dp[i]
     * 2. 递推公式：决定dp[i]的因素就是第i房间偷还是不偷
     *      如果偷第i房间，那么dp[i] = dp[i - 2] + nums[i]
     *      如果不偷第i房间，那么dp[i] = dp[i - 1]，注意这里是考虑，并不是一定要偷i-1号房间，考虑i-1就是dp[i-1]
     *      然后dp[i]取最大值，即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
     * 3. 初始化数组：dp[0] = nums[0]  dp[1] = max(nums[0], nums[1]);
     * 4. 遍历顺序：dp[i] 是根据dp[i-2] 和 dp[i-1] 推导出来的，所以是从前到后遍历
     */

    public int rob(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];

        if(n==0) return 0;
        if(n==1) return nums[0];

        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for (int i = 2; i < n; i++) {
            dp[i] = Math.max( dp[i - 2] + nums[i], dp[i - 1] );
        }
        return dp[n - 1];
    }
}
